Optimering av JavaScripts modulgraf: Förenkling av beroendegrafen | MLOG | MLOG
            document.addEventListener("DOMContentLoaded", function() {
 var lazyloadImages = document.querySelectorAll("img.lazy");

 function lazyload () {
 lazyloadImages.forEach(function(img) {
 if (img.offsetTop < (window.innerHeight + window.pageYOffset)) {
 img.src = img.dataset.src;
 img.classList.remove("lazy");
 }
 });
 if(lazyloadImages.length === 0) {
 document.removeEventListener("scroll", lazyload);
 window.removeEventListener("resize", lazyload);
 window.removeEventListener("orientationChange", lazyload);
 }
 }

 document.addEventListener("scroll", lazyload);
 window.addEventListener("resize", lazyload);
 window.addEventListener("orientationChange", lazyload);
 });
            

Praktisk insikt: Implementera lat laddning för bilder, videor och andra resurser som inte Ă€r omedelbart synliga pĂ„ skĂ€rmen. ÖvervĂ€g att anvĂ€nda bibliotek som `lozad.js` eller webblĂ€sarens inbyggda attribut för lat laddning.

6. Tree Shaking och eliminering av död kod

Tree shaking Àr en teknik som tar bort oanvÀnd kod frÄn din applikation under byggprocessen. Detta kan avsevÀrt minska paketstorleken, sÀrskilt om du anvÀnder bibliotek som innehÄller mycket kod som du inte behöver.

Exempel:

Anta att du anvÀnder ett verktygsbibliotek som innehÄller 100 funktioner, men du anvÀnder bara 5 av dem i din applikation. Utan tree shaking skulle hela biblioteket inkluderas i ditt paket. Med tree shaking skulle endast de 5 funktioner du anvÀnder inkluderas.

Konfiguration:

Se till att din bundlare Àr konfigurerad för att utföra tree shaking. I webpack Àr detta vanligtvis aktiverat som standard nÀr man anvÀnder produktionslÀge. I Rollup kan du behöva anvÀnda `@rollup/plugin-commonjs`-pluginet.

Praktisk insikt: Konfigurera din bundlare för att utföra tree shaking och se till att din kod Àr skriven pÄ ett sÀtt som Àr kompatibelt med tree shaking (t.ex. genom att anvÀnda ES-moduler).

7. Minimera beroenden

Antalet beroenden i ditt projekt kan direkt pÄverka modulgrafens komplexitet. Varje beroende lÀggs till i grafen, vilket potentiellt ökar byggtider och paketstorlekar. Granska regelbundet dina beroenden och ta bort de som inte lÀngre behövs eller kan ersÀttas med mindre alternativ.

Exempel:

IstÀllet för att anvÀnda ett stort verktygsbibliotek för en enkel uppgift, övervÀg att skriva din egen funktion eller anvÀnda ett mindre, mer specialiserat bibliotek.

Praktisk insikt: Granska regelbundet dina beroenden med verktyg som `npm audit` eller `yarn audit` och identifiera möjligheter att minska antalet beroenden eller ersÀtta dem med mindre alternativ.

8. Analysera paketstorlek och prestanda

Analysera regelbundet din paketstorlek och prestanda för att identifiera omrÄden för förbÀttring. Verktyg som webpack-bundle-analyzer och Lighthouse kan hjÀlpa dig att identifiera stora moduler, oanvÀnd kod och prestandaflaskhalsar.

Exempel (webpack-bundle-analyzer):

LĂ€gg till `webpack-bundle-analyzer`-pluginet i din webpack-konfiguration.

            const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;

module.exports = {
 // ... annan webpack-konfiguration
 plugins: [
 new BundleAnalyzerPlugin()
 ]
};

            

NÀr du kör din byggprocess kommer pluginet att generera en interaktiv trÀdkarta (treemap) som visar storleken pÄ varje modul i ditt paket.

Praktisk insikt: Integrera paketanalysverktyg i din byggprocess och granska regelbundet resultaten för att identifiera omrÄden för optimering.

9. Module Federation

Module Federation, en funktion i webpack 5, lÄter dig dela kod mellan olika applikationer under körning. Detta kan vara anvÀndbart för att bygga mikro-frontends eller för att dela gemensamma komponenter mellan olika projekt. Module Federation kan hjÀlpa till att minska paketstorlekar och förbÀttra prestanda genom att undvika duplicering av kod.

Exempel (GrundlÀggande konfiguration av Module Federation):

Applikation A (VĂ€rd):

            // webpack.config.js
const ModuleFederationPlugin = require("webpack/lib/container/ModuleFederationPlugin");

module.exports = {
 // ... annan webpack-konfiguration
 plugins: [
 new ModuleFederationPlugin({
 name: "appA",
 remotes: {
 appB: "appB@http://localhost:3001/remoteEntry.js",
 },
 shared: ["react", "react-dom"]
 })
 ]
};

            

Applikation B (FjÀrr):

            // webpack.config.js
const ModuleFederationPlugin = require("webpack/lib/container/ModuleFederationPlugin");

module.exports = {
 // ... annan webpack-konfiguration
 plugins: [
 new ModuleFederationPlugin({
 name: "appB",
 exposes: {
 './MyComponent': './src/MyComponent',
 },
 shared: ["react", "react-dom"]
 })
 ]
};

            

Praktisk insikt: ÖvervĂ€g att anvĂ€nda Module Federation för stora applikationer med delad kod eller för att bygga mikro-frontends.

Specifika övervÀganden för bundlare

Olika bundlare har olika styrkor och svagheter nÀr det gÀller optimering av modulgrafen. HÀr Àr nÄgra specifika övervÀganden för populÀra bundlare:

Webpack

Rollup

Parcel

Globalt perspektiv: Anpassa optimeringar för olika sammanhang

NÀr man optimerar modulgrafen Àr det viktigt att ta hÀnsyn till det globala sammanhanget dÀr din applikation kommer att anvÀndas. Faktorer som nÀtverksförhÄllanden, enheters kapacitet och anvÀndardemografi kan pÄverka effektiviteten av olika optimeringstekniker.

Slutsats

Att optimera JavaScripts modulgraf Àr en avgörande aspekt av front-end-utveckling. Genom att förenkla beroenden, ta bort cirkulÀra beroenden och implementera koddelning kan du avsevÀrt förbÀttra byggprestanda, minska paketstorleken och förbÀttra applikationens laddningstider. Analysera regelbundet din paketstorlek och prestanda för att identifiera omrÄden för förbÀttring och anpassa dina optimeringsstrategier till det globala sammanhanget dÀr din applikation kommer att anvÀndas. Kom ihÄg att optimering Àr en pÄgÄende process, och kontinuerlig övervakning och förfining Àr avgörande för att uppnÄ optimala resultat.

Genom att konsekvent tillÀmpa dessa tekniker kan utvecklare över hela vÀrlden skapa snabbare, effektivare och mer anvÀndarvÀnliga webbapplikationer.